GraphQL কি?
GraphQL হলো একটি query language এবং runtime যা API ডিজাইন এবং ডেটা ফেচিংয়ের জন্য ব্যবহৃত হয়। এটি REST API-এর বিকল্প হিসেবে জনপ্রিয় হয়ে উঠেছে। GraphQL ডেভেলপারদের একটি নির্দিষ্ট API কভারেজে বেশি ডেটা ফেচ করার পরিবর্তে তাদের শুধুমাত্র প্রয়োজনীয় ডেটা ফেচ করার ক্ষমতা প্রদান করে।
GraphQL এর প্রধান সুবিধা হলো এটি কাস্টমাইজড ডেটা রিকোয়েস্ট করার অনুমতি দেয় এবং ডেটার অপচয় বা অপ্রয়োজনীয় ডেটা লোডিং এড়াতে সহায়ক হয়।
GraphQL এর মূল বৈশিষ্ট্য
- Single Endpoint:
GraphQL এ সবকিছু একক এন্ডপয়েন্টের মাধ্যমে পরিচালিত হয়, যেখানে একাধিক HTTP রিকোয়েস্ট করার প্রয়োজন হয় না। উদাহরণস্বরূপ, ডেটা, মিউটেশন এবং সাবস্ক্রিপশন সবকিছুই একসাথে পরিচালিত হয়। - Flexible Queries:
ক্লায়েন্ট কেবলমাত্র প্রয়োজনীয় ডেটা চায়, অর্থাৎ clients তাদের প্রয়োজনীয় fields নির্বাচিত করে এবং মাত্র সেই তথ্যটি ফেচ করে। এতে ডেটার অপচয় কমে। - Strongly Typed Schema:
GraphQL এর একটি টাইপড স্কিমা থাকে, যার মাধ্যমে আপনার ডেটার কাঠামো পরিষ্কারভাবে সংজ্ঞায়িত করা হয়। স্কিমা জানায় কী ধরনের তথ্য ফেচ করা যাবে এবং কীভাবে ডেটা ম্যানিপুলেট করা যাবে। - Realtime Data via Subscriptions:
GraphQL-এর মাধ্যমে real-time data হ্যান্ডেল করতে subscriptions ব্যবহার করা হয়। এটি ডেটা আপডেট হওয়ার সাথে সাথে ক্লায়েন্টে রিয়েল-টাইমে ডেটা সিঙ্ক্রোনাইজেশন নিশ্চিত করে। 
Apollo কী?
Apollo হলো একটি ওপেন-সোর্স প্ল্যাটফর্ম যা GraphQL এর সাথে ইন্টিগ্রেশন করতে ব্যবহৃত হয়। Apollo গ্রাফকিউএল সার্ভার এবং ক্লায়েন্ট উভয়ই সরবরাহ করে এবং এটি ডেভেলপারদের GraphQL API দ্রুত ডেভেলপ এবং ইন্টিগ্রেট করতে সহায়ক।
Apollo Client এবং Apollo Server দুটি প্রধান অংশে বিভক্ত:
- Apollo Client:
এটি ক্লায়েন্ট সাইডে ব্যবহৃত হয় এবং GraphQL API থেকে ডেটা ফেচ করে। - Apollo Server:
এটি সার্ভার সাইডে ব্যবহৃত হয় এবং GraphQL API পরিচালনা করে। এটি schema, resolvers এবং data sources পরিচালনা করে। 
GraphQL এবং Apollo Integration
Apollo GraphQL এর সাথে ইন্টিগ্রেট করতে বেশ কার্যকর এবং এটি আপনাকে GraphQL এন্ডপয়েন্ট তৈরি, ডেটা ম্যানিপুলেশন এবং ক্লায়েন্টে রিয়েল-টাইম ডেটা সিঙ্ক্রোনাইজেশন খুব সহজে করতে দেয়। এখানে আমরা Apollo Client এবং Apollo Server ইন্টিগ্রেশন দেখব।
Apollo Server Integration
Apollo Server হলো একটি GraphQL সার্ভার যা REST API এর মতো কাজ করে এবং GraphQL schema, resolvers ইত্যাদি নির্ধারণ করার জন্য একটি সহজ API প্রদান করে।
Apollo Server Setup Example:
// Apollo Server Setup (server.js)
const { ApolloServer, gql } = require('apollo-server');
// GraphQL Schema Definition
const typeDefs = gql`
  type Query {
    hello: String
  }
`;
// Resolver Functions
const resolvers = {
  Query: {
    hello: () => 'Hello, world!',
  },
};
// Apollo Server Instance
const server = new ApolloServer({
  typeDefs,
  resolvers,
});
// Start the Apollo Server
server.listen().then(({ url }) => {
  console.log(`Server running at ${url}`);
});
এখানে, আমরা একটি সিম্পল Query তৈরি করেছি, যা "hello" নামক একটি স্ট্রিং রিটার্ন করবে। ApolloServer এর মাধ্যমে এটি একটি সার্ভার তৈরি এবং রান করানো হয়েছে।
Apollo Client Integration
Apollo Client হলো একটি JavaScript লাইব্রেরি যা ব্রাউজার বা React অ্যাপ্লিকেশন থেকে GraphQL API এর সাথে যোগাযোগ করতে ব্যবহৃত হয়। এটি ডেটা ক্যাশিং, রিয়েল-টাইম সাবস্ক্রিপশন, এবং অন্যান্য উন্নত ফিচারের জন্য ব্যবহৃত হয়।
Apollo Client Setup Example (React):
// Apollo Client Setup (App.js)
import React from 'react';
import { ApolloProvider, InMemoryCache } from '@apollo/client';
import { gql, useQuery } from '@apollo/client';
// Apollo Client Instance
const client = new ApolloClient({
  uri: 'http://localhost:4000/', // Server URL
  cache: new InMemoryCache(),
});
// GraphQL Query
const GET_HELLO = gql`
  query GetHello {
    hello
  }
`;
const App = () => {
  const { loading, error, data } = useQuery(GET_HELLO);
  if (loading) return <p>Loading...</p>;
  if (error) return <p>Error: {error.message}</p>;
  return <div>{data.hello}</div>;
};
// Wrap the app with ApolloProvider
const Main = () => (
  <ApolloProvider client={client}>
    <App />
  </ApolloProvider>
);
export default Main;
এখানে, Apollo Client ব্যবহার করে আমরা GET_HELLO নামক একটি GraphQL query পাঠাচ্ছি। এরপর এই ডেটা useQuery হুকের মাধ্যমে অ্যাপ্লিকেশন এ লোড হচ্ছে।
Apollo Server এবং Client এর মধ্যে ডেটা ইন্টিগ্রেশন
- Server Side:
Apollo Server এর মাধ্যমে একটি GraphQL API তৈরি করুন যেখানে Queries, Mutations, এবং Subscriptions ডিফাইন করা হবে। এটি সঠিকভাবে স্কিমা ও রিজলভার পরিচালনা করে। - Client Side:
Apollo Client ব্যবহার করে, React বা অন্য যেকোনো ক্লায়েন্ট সাইড ফ্রেমওয়ার্কে GraphQL API থেকে ডেটা ফেচ করতে পারেন এবং রিয়েল-টাইম ডেটা সিঙ্ক্রোনাইজেশন করতে পারেন। 
সারাংশ
GraphQL এবং Apollo একত্রে ডেটা ফেচিং, ক্যাশিং এবং রিয়েল-টাইম ডেটা সিঙ্ক্রোনাইজেশন নিশ্চিত করতে অত্যন্ত কার্যকরী। Apollo Client এবং Apollo Server এর মাধ্যমে GraphQL API তৈরি, পরিচালনা এবং ব্যবহার করা সহজ হয়ে ওঠে। Apollo Server GraphQL সার্ভার তৈরি করে এবং Apollo Client ক্লায়েন্ট সাইড থেকে ডেটা ফেচ করে, যা ডেভেলপারদের শক্তিশালী এবং স্কেলেবল API তৈরি করতে সহায়ক।
GraphQL কি?
GraphQL একটি API query language এবং runtime environment, যা Facebook ২০১২ সালে তৈরি করে এবং ২০১৫ সালে ওপেন সোর্স করা হয়। এটি REST API এর একটি আধুনিক বিকল্প হিসেবে ব্যবহৃত হয়। GraphQL ব্যবহার করে, ক্লায়েন্ট শুধুমাত্র প্রয়োজনীয় ডেটাই প্রশ্ন করতে পারে এবং সার্ভার শুধুমাত্র সেই ডেটাই প্রদান করে, যার ফলে কার্যক্ষমতা এবং ডেটা ব্যবস্থাপনা অনেক সহজ এবং দ্রুত হয়ে ওঠে।
GraphQL এ, আপনি queries, mutations এবং subscriptions এর মাধ্যমে ডেটা ফেচ এবং পরিচালনা করতে পারেন।
- Query: ডেটা পড়ার জন্য ব্যবহৃত হয়।
 - Mutation: ডেটা পরিবর্তন বা তৈরি করার জন্য ব্যবহৃত হয়।
 - Subscription: রিয়েল-টাইম ডেটা আপডেটের জন্য ব্যবহৃত হয়।
 
GraphQL একটি typed schema ব্যবহার করে, যার মাধ্যমে আপনি নির্দিষ্ট ডেটা কাঠামো (schema) বর্ণনা করতে পারেন, এবং এটি ডেটার মধ্যে কোন পরিবর্তন ঘটবে তা নির্ধারণ করা হয়।
GraphQL এর বৈশিষ্ট্য:
কাস্টমাইজড ডেটা রিকোয়েস্ট:
GraphQL এর সবচেয়ে বড় বৈশিষ্ট্য হলো, ক্লায়েন্ট শুধুমাত্র প্রয়োজনীয় ডেটা চায়। এর মানে হলো, আপনি একটি ডেটাবেস থেকে একসাথে সমস্ত ডেটা পেতে পারেন, তবে কেবল প্রয়োজনীয় ডেটাই ফিরে পাবেন, যা over-fetching বা under-fetching প্রতিরোধ করে।উদাহরণস্বরূপ, আপনি যদি একটি ইউজারের নাম এবং ইমেইল চাচ্ছেন, তবে শুধুমাত্র সেই দুটি ফিল্ডই সার্ভার থেকে আনা হবে।
query { user(id: "1") { name email } }একটি রিকোয়েস্টে বহু রিসোর্স:
GraphQL একটি একক রিকোয়েস্টে একাধিক রিসোর্স থেকে ডেটা আনার সুবিধা প্রদান করে। যেমন, একসাথে ইউজার ডেটা এবং তার পোস্ট দুইটি পৃথক রিসোর্স হতে আনা সম্ভব।query { user(id: "1") { name posts { title content } } }- টাইপ সিস্টেম (Strong Typing):
GraphQL একটি টাইপ সিস্টেম ব্যবহার করে, যেখানে আপনি ডেটার কাঠামো (schema) লিখে দিতে পারেন। এতে ডেটা কখনও invalid হবে না, কারণ API নিজে নিশ্চিত করে যে সমস্ত রিকোয়েস্ট টাইপ অনুযায়ী সঠিক। Real-time Data via Subscriptions:
GraphQL ব্যবহারকারীদের রিয়েল-টাইম ডেটা পাওয়ার সুবিধা দেয় Subscriptions এর মাধ্যমে। এটি ক্লায়েন্টকে রিয়েল-টাইম ডেটা আপডেট প্রদান করে, যেমন চ্যাট অ্যাপ্লিকেশনে নতুন মেসেজ আসলে স্বয়ংক্রিয়ভাবে ক্লায়েন্টে তা প্রদর্শন হয়।subscription { messageAdded { content user } }- ফ্লেক্সিবল এবং স্কেলেবল:
GraphQL খুবই স্কেলেবল এবং এটি বিভিন্ন ধরনের ডেটাবেস, সার্ভিস বা সিস্টেমের সাথে সংযুক্ত হতে পারে। একাধিক সার্ভিস থেকে ডেটা সংগ্রহ করে একসাথে ক্লায়েন্টকে প্রদান করা যায়। 
GraphQL কেন ব্যবহার করবেন?
- কমপ্লেক্স ডেটা ফেচিং কমানো:
GraphQL ক্লায়েন্টকে exactly what they need প্রদান করে, যার ফলে over-fetching (অতিরিক্ত ডেটা ফেচ করা) এবং under-fetching (প্রয়োজনীয় ডেটা না পাওয়া) সমস্যা কমে যায়। আপনি যখন REST API ব্যবহার করেন, তখন বিভিন্ন এন্ডপয়েন্ট থেকে ডেটা ফেচ করতে হয়, কিন্তু GraphQL একটি একক রিকোয়েস্টে সব ডেটা নিয়ে আসতে পারে। - ডেটার ত্বরণ এবং কার্যকারিতা বৃদ্ধি:
সার্ভার এবং ক্লায়েন্টের মধ্যে ডেটা আদান-প্রদান আরও দ্রুত এবং কার্যকরী হয়, কারণ ক্লায়েন্ট শুধুমাত্র প্রয়োজনীয় তথ্যই অনুসন্ধান করতে পারে এবং সার্ভার শুধু সেটি সরবরাহ করবে। - ফ্রন্টএন্ড এবং ব্যাকএন্ডের মধ্যে সমন্বয়:
GraphQL ডেভেলপারদের ফ্রন্টএন্ড এবং ব্যাকএন্ডের মধ্যে সঠিকভাবে সমন্বয় করতে সাহায্য করে, কারণ ফ্রন্টএন্ড ডেভেলপারদের API এর কাঠামো সম্পর্কে পরিষ্কার ধারণা থাকে এবং তারা API থেকে নির্দিষ্ট ডেটা ক্লিয়ারলি চয়ন করতে পারে। - ডেটার স্কিমা প্রিভিউ:
GraphQL এর মাধ্যমে ক্লায়েন্ট ডেভেলপাররা ডেটার স্কিমা (structure) দেখতে পায় এবং তারা API থেকে কী ধরনের ডেটা প্রত্যাশা করতে পারে তা জানে। - এফেক্টিভ ফ্লেক্সিবিলিটি এবং ইন্টিগ্রেশন:
GraphQL অন্য অনেক সার্ভিসের সাথে ইন্টিগ্রেট করা সহজ এবং এতে RESTful সার্ভিসের জন্য আরও বেশী ফ্লেক্সিবিলিটি প্রদান করা হয়। 
কখন GraphQL ব্যবহার করবেন না?
যদিও GraphQL অনেক সুবিধা প্রদান করে, তবে সব ক্ষেত্রেই এটি ব্যবহার উপযুক্ত নয়। কিছু পরিস্থিতিতে, যেখানে ডেটার প্রক্রিয়াকরণ অনেক জটিল নয় এবং API গুলি সহজ, সেখানে REST API একটি সহজ সমাধান হতে পারে।
যখন GraphQL ব্যবহার না করা উচিত:
- সাধারণ API এর জন্য:
যদি আপনার API বেশ সাধারণ হয় এবং ডেটার কাঠামো পরিবর্তন হয় না, তবে REST API যথেষ্ট হতে পারে। - ফ্রন্টএন্ডে অনেক বড় কাজ নেই:
যদি আপনার অ্যাপ্লিকেশন একটি সাধারণ, সহজ অ্যাপ্লিকেশন হয়, যেখানে ডেটার পরিমাণ ছোট এবং পরিবর্তন খুব কম হয়, তবে GraphQL এর সুবিধা পুরোপুরি কাজে আসবে না। 
সারাংশ
GraphQL একটি শক্তিশালী API query language এবং runtime environment যা ডেটা ফেচ এবং ম্যানেজমেন্টে গতি এবং কার্যক্ষমতা বৃদ্ধি করে। এটি REST API-এর তুলনায় অনেক বেশি ফ্লেক্সিবল, কমপ্লেক্স ডেটা ফেচিং কমিয়ে আনে এবং ডেভেলপারদের exact data request করার সুবিধা প্রদান করে। GraphQL ব্যবহার করলে over-fetching এবং under-fetching সমস্যাগুলি দূর করা সম্ভব এবং এটি real-time data হ্যান্ডলিংকেও সাহায্য করে।
Apollo Server হলো একটি জনপ্রিয় GraphQL সার্ভার লাইব্রেরি, যা ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদান করার জন্য একটি শক্তিশালী এবং দক্ষ উপায় প্রদান করে। Meteor একটি পূর্ণস্ট্যাক ফ্রেমওয়ার্ক যা GraphQL এবং Apollo Server এর সাথে একত্রে ব্যবহারের জন্য আদর্শ। Apollo Server Meteor অ্যাপ্লিকেশনের সাথে যুক্ত করতে গেলে আপনাকে কিছু স্টেপ অনুসরণ করতে হবে। এখানে Meteor এর সাথে Apollo Server সেটআপ করার পুরো প্রক্রিয়া দেওয়া হলো।
Step 1: প্রয়োজনীয় প্যাকেজ ইনস্টল করা
Apollo Server এবং GraphQL ব্যবহার করার জন্য কিছু প্যাকেজ ইনস্টল করতে হবে। প্রথমে, Apollo Server এবং GraphQL প্যাকেজগুলি ইনস্টল করুন।
meteor add graphql
npm install apollo-server
npm install graphql
এটি Apollo Server এবং GraphQL লাইব্রেরি আপনার Meteor অ্যাপ্লিকেশনে যুক্ত করবে।
Step 2: Apollo Server সেটআপ করা
এখন আমরা Apollo Server সেটআপ করব। আপনি Apollo Server এবং Meteor এর মধ্যে একটি GraphQL Schema তৈরি করবেন এবং তা Apollo Server এর সাথে যুক্ত করবেন।
Apollo Server সেটআপ:
import { ApolloServer, gql } from 'apollo-server'; import { Meteor } from 'meteor/meteor'; // 1. Create your GraphQL schema const typeDefs = gql` type Query { hello: String } `; const resolvers = { Query: { hello: () => 'Hello, World!', }, }; // 2. Initialize Apollo Server const server = new ApolloServer({ typeDefs, resolvers, }); // 3. Run Apollo Server Meteor.startup(() => { server.listen().then(({ url }) => { console.log(`Apollo Server running at ${url}`); }); });
এখানে, typeDefs হলো আপনার GraphQL schema, যেখানে Query ডিফাইন করা হয়েছে। Resolvers হলো সেই ফাংশন যা ক্লায়েন্টের প্রশ্নের (query) উত্তর সরবরাহ করে।
Step 3: Meteor এর মধ্যে Apollo Server অন্তর্ভুক্ত করা
আপনার Meteor অ্যাপ্লিকেশনের মধ্যে Apollo Server চলানোর জন্য আপনি Meteor.startup() ফাংশন ব্যবহার করবেন। এটি নিশ্চিত করবে যে Apollo Server চালু হবে যখন Meteor সার্ভার শুরু হবে।
এখানে আমরা Apollo Server এবং Meteor একত্রে চালাতে ব্যবহার করেছি server.listen() মেথড, যা Apollo Server কে নির্দিষ্ট URL এ চালু করবে।
Step 4: GraphQL API এর সাথে ডেটা ইন্টারঅ্যাকশন
এখন আপনি GraphQL Query তৈরি করতে পারেন এবং Apollo Server এর মাধ্যমে ডেটা পুনরুদ্ধার করতে পারেন। Meteor এর সাথে যুক্ত MongoDB ডাটাবেস থেকে ডেটা ফেচ করার জন্য একটি resolver তৈরি করুন।
MongoDB থেকে ডেটা ফেচ করার উদাহরণ:
Meteor MongoDB Collection তৈরি করা:
import { Mongo } from 'meteor/mongo'; export const Tasks = new Mongo.Collection('tasks');GraphQL Query এর মাধ্যমে MongoDB থেকে ডেটা ফেচ করা:
const typeDefs = gql` type Task { _id: String name: String } type Query { tasks: [Task] } `; const resolvers = { Query: { tasks: () => { return Tasks.find().fetch(); // MongoDB থেকে ডেটা ফেচ করা }, }, };Apollo Server সেটআপ:
const server = new ApolloServer({ typeDefs, resolvers, }); Meteor.startup(() => { server.listen().then(({ url }) => { console.log(`Apollo Server running at ${url}`); }); });
এখন আপনি GraphQL Query এর মাধ্যমে MongoDB ডাটাবেস থেকে tasks ডেটা ফেচ করতে পারবেন।
Step 5: Apollo Server এর সাথে Authentication যোগ করা
Meteor Accounts ব্যবহার করে আপনি Apollo Server এর সাথে Authentication যোগ করতে পারেন। আপনি Meteor's Accounts API ব্যবহার করে নিরাপদভাবে ব্যবহারকারীকে লগইন করতে পারেন এবং GraphQL API তে Authentication নিশ্চিত করতে পারেন।
Authentication Example:
const resolvers = {
  Query: {
    tasks: (parent, args, context) => {
      if (!context.user) {
        throw new Error('Not authenticated');
      }
      return Tasks.find().fetch();
    },
  },
};
const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req }) => {
    // Authenticate user
    const token = req.headers.authorization || '';
    const user = Accounts.verifyToken(token);
    return { user };
  },
});
Meteor.startup(() => {
  server.listen().then(({ url }) => {
    console.log(`Apollo Server running at ${url}`);
  });
});
এখানে, context ফাংশনে authentication চেক করা হচ্ছে। যদি ব্যবহারকারী authenticated না হয়, তবে tasks ডেটা ফেচ করা হবে না এবং একটি ত্রুটি (error) দেখানো হবে।
Step 6: Apollo Client ব্যবহার করা
অবশেষে, আপনি Apollo Client ব্যবহার করে GraphQL API এর সাথে যোগাযোগ করতে পারেন। আপনি Apollo Client ব্যবহার করে Meteor অ্যাপ্লিকেশন থেকে GraphQL Queries পাঠাতে পারেন এবং ডেটা ফেচ করতে পারেন।
npm install @apollo/client graphql
import { ApolloClient, InMemoryCache, gql } from '@apollo/client';
const client = new ApolloClient({
  uri: 'http://localhost:4000',
  cache: new InMemoryCache(),
});
client
  .query({
    query: gql`
      query {
        tasks {
          _id
          name
        }
      }
    `,
  })
  .then(result => console.log(result));
এখানে, Apollo Client Meteor অ্যাপ্লিকেশনের সাথে সংযুক্ত GraphQL API থেকে tasks ডেটা ফেচ করছে।
সারাংশ
Meteor এবং Apollo Server ব্যবহার করে GraphQL API তৈরি করা একটি শক্তিশালী পদ্ধতি যা ডেটা ফেচিং এবং ম্যানিপুলেশন সহজ করে তোলে। Apollo Server Meteor অ্যাপ্লিকেশনের সাথে সংযুক্ত হয়ে MongoDB বা অন্যান্য ডেটাবেস থেকে ডেটা পুনরুদ্ধার করতে সক্ষম হয়। এটি অ্যাপ্লিকেশনকে আরো দক্ষ এবং স্কেলেবল করে তোলে, বিশেষ করে যখন আপনি complex queries এবং real-time data এর সাথে কাজ করছেন।
GraphQL একটি শক্তিশালী এবং flexibel API query language যা REST API এর তুলনায় অনেক বেশি কার্যকরী এবং উন্নত। GraphQL আপনাকে আপনার ডেটা কীভাবে সংগ্রহ করা হবে তা নির্দিষ্ট করতে দেয় এবং একাধিক রিকোয়েস্ট একত্রে পাঠানো সম্ভব করে, যা কার্যকারিতা উন্নত করে।
Meteor এ GraphQL ব্যবহার করা জন্য আপনি Apollo এবং GraphQL এর প্যাকেজগুলি ব্যবহার করতে পারেন। Apollo Server ব্যবহার করে আপনি সহজেই GraphQL এর জন্য queries এবং mutations তৈরি করতে পারেন।
GraphQL Query এবং Mutations কী?
- Query:
Query ব্যবহার করে আপনি ডেটা রিট্রিভ (fetch) করতে পারেন। এটি মূলত GET রিকোয়েস্টের মতো কাজ করে। - Mutation:
Mutation ব্যবহার করে আপনি ডেটা পরিবর্তন করতে পারেন, যেমন ডেটা ইনসার্ট, আপডেট বা ডিলিট করা। এটি মূলত POST, PUT, DELETE রিকোয়েস্টের মতো কাজ করে। 
Meteor-এ GraphQL Query এবং Mutations ব্যবহার করা
প্রথমে GraphQL এবং Apollo প্যাকেজ ইনস্টল করা
Apollo Server এবং GraphQL প্যাকেজ ইনস্টল করা:
meteor add apollo meteor add graphql- Meteor-এ Apollo Server সেটআপ করা: Apollo Server Meteor-এ GraphQL সার্ভার চালু করতে সাহায্য করে।
 
এটা করতে হবে:
// /server/main.js
import { ApolloServer, gql } from 'apollo-server-meteor';
import { Tasks } from '/imports/api/tasks.js';
// GraphQL Schema: Queries and Mutations
const typeDefs = gql`
  type Task {
    _id: String
    text: String
    createdAt: String
  }
  type Query {
    tasks: [Task]
    task(_id: String): Task
  }
  type Mutation {
    addTask(text: String!): Task
    deleteTask(_id: String!): Boolean
  }
`;
// Resolvers: Query and Mutation Logic
const resolvers = {
  Query: {
    tasks() {
      return Tasks.find().fetch();  // Retrieve all tasks
    },
    task(_, { _id }) {
      return Tasks.findOne(_id);  // Retrieve a task by ID
    },
  },
  Mutation: {
    addTask(_, { text }) {
      const task = {
        text,
        createdAt: new Date(),
      };
      const taskId = Tasks.insert(task);
      return { _id: taskId, text, createdAt: task.createdAt };
    },
    deleteTask(_, { _id }) {
      return Tasks.remove({ _id });
    },
  },
};
// Setting up Apollo Server
const server = new ApolloServer({
  typeDefs,
  resolvers,
  subscriptions: false, // disable subscriptions for now
});
server.applyMiddleware({ app: Meteor });
এখানে, আমরা tasks এবং task নামক Queries এবং addTask ও deleteTask নামক Mutations তৈরি করেছি। আমাদের Tasks কোলেকশনের ওপর কাজ করছে।
GraphQL Query উদাহরণ
Query ব্যবহার করে আপনি ডেটা রিট্রিভ করতে পারেন, যেমন:
query {
  tasks {
    _id
    text
    createdAt
  }
}
এখানে, tasks নামক query ব্যবহার করে আপনি সমস্ত টাস্কের _id, text এবং createdAt এর মান পাবেন।
GraphQL Mutation উদাহরণ
Mutation ব্যবহার করে আপনি ডেটা ইনসার্ট বা আপডেট করতে পারেন, যেমন:
mutation {
  addTask(text: "Learn GraphQL with Meteor") {
    _id
    text
    createdAt
  }
}
এখানে, addTask Mutation ব্যবহার করা হয়েছে একটি নতুন টাস্ক যোগ করতে এবং তার সাথে _id, text, এবং createdAt ডেটা ফেরত পাবেন।
Meteor Client-Side এ GraphQL Query এবং Mutation ব্যবহার করা
Meteor-এ GraphQL Query এবং Mutation ক্লায়েন্ট সাইডে Apollo Client এর মাধ্যমে ব্যবহার করা হয়। Apollo Client আপনাকে GraphQL সার্ভারের সাথে যোগাযোগ করতে সহায়ক।
1. Apollo Client প্যাকেজ ইনস্টল করা
meteor add apollo-client
2. Client-Side Code (GraphQL Query এবং Mutation)
// /client/main.js
import { ApolloClient, InMemoryCache, gql } from '@apollo/client';
const client = new ApolloClient({
  uri: '/graphql',
  cache: new InMemoryCache(),
});
// Example: Query all tasks
client
  .query({
    query: gql`
      query {
        tasks {
          _id
          text
          createdAt
        }
      }
    `,
  })
  .then((result) => console.log(result.data.tasks));
// Example: Mutation to add a task
client
  .mutate({
    mutation: gql`
      mutation {
        addTask(text: "Learn GraphQL with Meteor") {
          _id
          text
          createdAt
        }
      }
    `,
  })
  .then((result) => console.log(result.data.addTask));
এখানে, প্রথমে একটি Query করা হয়েছে সমস্ত টাস্কের তথ্য পাওয়ার জন্য এবং তারপর একটি Mutation করা হয়েছে একটি নতুন টাস্ক ইনসার্ট করার জন্য।
Subscription (Optional)
আপনি যদি real-time data চান, তবে Subscription ব্যবহার করতে পারেন, যা সার্ভারের ডেটা পরিবর্তন হলে তা ক্লায়েন্টে তাত্ক্ষণিকভাবে আপডেট করবে।
// /server/main.js
const typeDefs = gql`
  type Subscription {
    taskAdded: Task
  }
  // Your other query and mutation typeDefs
`;
const resolvers = {
  Subscription: {
    taskAdded: {
      subscribe: () => pubsub.asyncIterator(['TASK_ADDED']),
    },
  },
  Mutation: {
    addTask(_, { text }) {
      const task = {
        text,
        createdAt: new Date(),
      };
      const taskId = Tasks.insert(task);
      pubsub.publish('TASK_ADDED', { taskAdded: task });
      return { _id: taskId, text, createdAt: task.createdAt };
    },
  },
};
এখানে, taskAdded নামক Subscription ব্যবহার করা হয়েছে। যখনই addTask মিউটেশন হবে, তখন taskAdded সাবস্ক্রাইবারদের কাছে পাঠানো হবে।
সারাংশ
Meteor-এ GraphQL Queries এবং Mutations খুবই সহজ এবং কার্যকরীভাবে ব্যবহৃত হতে পারে Apollo Server এবং Apollo Client প্যাকেজের মাধ্যমে। Queries ব্যবহার করে ডেটা রিট্রিভ এবং Mutations ব্যবহার করে ডেটা ইনসার্ট বা আপডেট করা হয়। আপনি GraphQL সার্ভারের সাথে ক্লায়েন্ট সাইডে Apollo Client এর মাধ্যমে যোগাযোগ করতে পারেন। আপনি Subscriptions ব্যবহার করে রিয়েল-টাইম ডেটা আপডেটও করতে পারেন। GraphQL আপনাকে ডেটা রিট্রিভ করার আরো নির্দিষ্ট এবং কার্যকরী উপায় প্রদান করে, যা REST API এর তুলনায় অনেক বেশি কার্যকরী হতে পারে।
GraphQL হল একটি শক্তিশালী API প্রযুক্তি যা ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদান সহজ করে তোলে। এটি queries, mutations, এবং subscriptions ব্যবহার করে ডেটা পরিচালনা করে। Subscriptions হল GraphQL এর একটি শক্তিশালী ফিচার, যা রিয়েল-টাইম ডেটা আপডেট করার জন্য ব্যবহৃত হয়।
Meteor এ GraphQL Subscriptions ব্যবহার করে আপনি রিয়েল-টাইম ডেটা ফেচিং এবং আপডেট করতে পারেন, যা ক্লায়েন্টকে ডেটার পরিবর্তন সম্পর্কে অবহিত করতে সাহায্য করে।
GraphQL Subscriptions কী?
GraphQL Subscriptions একটি বিশেষ ধরনের GraphQL অপারেশন যা ক্লায়েন্টকে রিয়েল-টাইম ডেটা আপডেট পাঠাতে সক্ষম করে। ক্লায়েন্ট একটি subscription এর জন্য সাবস্ক্রাইব করলে, সার্ভার তখন ডেটা পরিবর্তনের পর ক্লায়েন্টকে অবহিত করে। এটি সাধারনত WebSocket এর মাধ্যমে কাজ করে।
GraphQL Subscriptions এর ব্যবহারের সুবিধা
- Realtime updates: ডেটা পরিবর্তন হলে ক্লায়েন্টকে তাৎক্ষণিকভাবে অবহিত করা।
 - Efficient data fetching: একাধিক ডেটা রাউন্ড ট্রিপ ছাড়াই একযোগে রিয়েল-টাইম ডেটা ফেচিং।
 - Bidirectional communication: ক্লায়েন্ট এবং সার্ভারের মধ্যে রিয়েল-টাইম যোগাযোগ।
 
Meteor এ GraphQL Subscriptions সেটআপ করা
Meteor এ GraphQL Subscriptions ব্যবহার করার জন্য আপনাকে Apollo Server এবং WebSocket সাপোর্ট যোগ করতে হবে। এখানে একটি সাধারণ উদাহরণ দেওয়া হলো কিভাবে Meteor এ GraphQL Subscriptions সেটআপ করতে হয়।
Step 1: প্রয়োজনীয় প্যাকেজগুলি ইনস্টল করা
প্রথমে, আপনি Apollo Server এবং Subscriptions-Transport-WS প্যাকেজগুলি ইনস্টল করবেন:
meteor npm install apollo-server-express graphql subscriptions-transport-ws express
এখানে, Apollo Server এবং GraphQL সার্ভার তৈরি করার জন্য, এবং Subscriptions-Transport-WS প্যাকেজটি WebSocket এর মাধ্যমে Subscriptions পরিচালনার জন্য ব্যবহৃত হবে।
Step 2: Apollo Server সেটআপ করা
Meteor এ Apollo Server সেটআপ করতে, Express এবং Apollo Server ব্যবহার করা হয়। নিচে একটি সাদাসিধে উদাহরণ দেওয়া হলো।
import { Meteor } from 'meteor/meteor';
import { ApolloServer, gql } from 'apollo-server-express';
import express from 'express';
import { makeExecutableSchema } from 'graphql-tools';
import { PubSub } from 'graphql-subscriptions';
// Instantiate express and create Apollo server
const app = express();
const pubsub = new PubSub();
// GraphQL schema definition
const typeDefs = gql`
  type Query {
    hello: String
  }
  type Subscription {
    messageAdded: String
  }
  type Mutation {
    addMessage(message: String!): String
  }
`;
// Resolvers to define how data is fetched
const resolvers = {
  Query: {
    hello: () => 'Hello, world!',
  },
  Mutation: {
    addMessage: (_, { message }) => {
      // Trigger subscription event when message is added
      pubsub.publish('messageAdded', { messageAdded: message });
      return message;
    },
  },
  Subscription: {
    messageAdded: {
      subscribe: () => pubsub.asyncIterator(['messageAdded']),
    },
  },
};
// Create Apollo Server with Express
const server = new ApolloServer({
  typeDefs,
  resolvers,
});
server.applyMiddleware({ app });
Meteor.startup(() => {
  // Listen on port 4000 for GraphQL
  app.listen(4000, () =>
    console.log(`GraphQL server is running at http://localhost:4000/graphql`)
  );
});
এখানে, messageAdded subscription তৈরি করা হয়েছে, যা নতুন মেসেজ সার্ভারে যুক্ত হলে ক্লায়েন্টকে অবহিত করবে। pubsub.publish এর মাধ্যমে একটি ইভেন্ট ট্রিগার করা হয় এবং asyncIterator এর মাধ্যমে ক্লায়েন্টকে সাবস্ক্রাইব করতে বলা হয়।
Step 3: Client-side Subscription সেটআপ করা
Meteor ক্লায়েন্টে Apollo Client ব্যবহার করে subscription সেটআপ করা হয়। নিচে ক্লায়েন্ট সাইডে একটি সাবস্ক্রিপশন উদাহরণ দেওয়া হলো:
import { ApolloClient, InMemoryCache, gql } from '@apollo/client';
import { WebSocketLink } from '@apollo/client/link/ws';
// Apollo Client setup with WebSocket link
const link = new WebSocketLink({
  uri: `ws://localhost:4000/graphql`,
  options: {
    reconnect: true,
  },
});
const client = new ApolloClient({
  link,
  cache: new InMemoryCache(),
});
// Subscription Query
const MESSAGE_ADDED = gql`
  subscription {
    messageAdded
  }
`;
client
  .subscribe({ query: MESSAGE_ADDED })
  .subscribe({
    next({ data }) {
      console.log("New message received:", data.messageAdded);
    },
    error(err) {
      console.error('Subscription error', err);
    },
  });
এখানে, WebSocketLink ব্যবহার করে আপনি WebSocket এর মাধ্যমে সার্ভারে সাবস্ক্রাইব করতে পারবেন এবং যখনই messageAdded subscription ট্রিগার হবে, তা ক্লায়েন্ট সাইডে next() ফাংশন দ্বারা রিসিভ হবে।
Step 4: Mutation to trigger Subscription
এখন, ক্লায়েন্ট থেকে মেসেজ পাঠানোর জন্য একটি mutation তৈরি করা হয়।
const ADD_MESSAGE = gql`
  mutation addMessage($message: String!) {
    addMessage(message: $message)
  }
`;
client.mutate({
  mutation: ADD_MESSAGE,
  variables: { message: "Hello, this is a new message!" },
})
.then(response => {
  console.log('Message added:', response.data.addMessage);
})
.catch(error => {
  console.error('Error adding message:', error);
});
এটি সার্ভারে একটি মেসেজ অ্যাড করার জন্য mutation পাঠাবে এবং যখনই মেসেজ অ্যাড হবে, ক্লায়েন্টের সাবস্ক্রিপশন রেসপন্স হিসাবে সেই মেসেজ পাবে।
সারাংশ
GraphQL Subscriptions ব্যবহার করে আপনি Realtime Data Fetching করতে পারেন। Meteor এবং Apollo Server ব্যবহার করে আপনি ক্লায়েন্ট এবং সার্ভারের মধ্যে WebSocket এর মাধ্যমে রিয়েল-টাইম ডেটা আপডেট করতে পারবেন। Subscriptions-Transport-WS এর মাধ্যমে আপনি ডেটা পরিবর্তনের সাথে সাথে ক্লায়েন্টকে অবহিত করতে পারেন, যা রিয়েল-টাইম অ্যাপ্লিকেশন তৈরি করতে সহায়ক। Mutation এবং Subscription একসাথে কাজ করলে রিয়েল-টাইম ডেটা প্রক্রিয়া সহজ এবং কার্যকরী হয়ে ওঠে।
Read more